package com.jinyuanchun.self.covid19;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.SocketException;

public class FtpUtils {
    // 本地字符编码
    private static String LOCAL_CHARSET = "UTF-8";
    // FTP协议里面，规定文件名编码为iso-8859-1
    private static String SERVER_CHARSET = "ISO-8859-1";
    /**
     * 获取FTPClient对象
     * @param ftpHost 服务器IP
     * @param ftpPort 服务器端口号
     * @param ftpUserName 用户名
     * @param ftpPassword 密码
     * @return FTPClient
     */
    public FTPClient getFTPClient(String ftpHost, int ftpPort,
                                  String ftpUserName, String ftpPassword) {

        FTPClient ftp = null;
        try {
            ftp = new FTPClient();
            // 连接FPT服务器,设置IP及端口
            ftp.connect(ftpHost, ftpPort);
            // 设置用户名和密码
            ftp.login(ftpUserName, ftpPassword);
            // 设置连接超时时间,5000毫秒
            ftp.setConnectTimeout(50000);
            // 设置中文编码集，防止中文乱码
//            ftp.setControlEncoding("UTF-8");
            if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
//                logger.info("未连接到FTP，用户名或密码错误");
                ftp.disconnect();
            } else {
                System.out.println("FTP连接成功");
//                logger.info("FTP连接成功");
            }
        } catch (SocketException e) {
            e.printStackTrace();
//            logger.info("FTP的IP地址可能错误，请正确配置");
        } catch (IOException e) {
            e.printStackTrace();
//            logger.info("FTP的端口错误,请正确配置");
        }
        return ftp;
    }

    /**
     * 关闭FTP方法
     * @param ftp
     * @return
     */
    public boolean closeFTP(FTPClient ftp){
        try {
            ftp.logout();
            System.out.println("FTP关闭");
        } catch (Exception e) {
//            logger.error("FTP关闭失败");
        }finally{
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
//                    logger.error("FTP关闭失败");
                }
            }
        }
        return false;
    }

    /**
     * 下载FTP下指定文件
     * @param ftp FTPClient对象
     * @param filePath FTP文件路径
     * @param fileName 文件名
     * @param downPath 下载保存的目录
     * @return
     */
    public boolean downLoadFTP(FTPClient ftp, String filePath, String fileName,
                               String downPath,String downName) {
//        if (FTPReply.isPositiveCompletion(ftp.sendCommand("OPTS UTF8","ON"))) {
//            LOCAL_CHARSET = "UTF-8";
//        }
        // 默认失败
        boolean flag = false;
        try {
            // 设置模式
            ftp.setControlEncoding(LOCAL_CHARSET);
            ftp.enterLocalPassiveMode();            // 设置被动模式
            ftp.setFileType(FTP.ASCII_FILE_TYPE);   // 设置传输模式
            // 跳转到文件目录
            ftp.changeWorkingDirectory(filePath);
            // 获取目录下文件集合
//           ftp.enterLocalPassiveMode();
            // ftp的原文件
            File ftpFile = new File(filePath+File.separator+fileName);
            // 下载后的文件
            File downFile = new File(downPath + File.separator
                    + downName);
            OutputStream out = new FileOutputStream(downFile);
            // 开始下载
            flag = ftp.retrieveFile(new String(ftpFile.getName().getBytes("UTF-8"),"ISO-8859-1"), out);
            out.flush();
            out.close();
            if(flag){
//                        logger.info("下载成功");
                System.out.println("下载成功 : "+fileName);
            }else{
//                        logger.error("下载失败");
                System.out.println("下载失败 : "+fileName);
            }
        } catch (Exception e) {
//            logger.error("下载失败");
        }

        return flag;
    }

}
